package service

import (
	"errors"
	"fitness/go-admin/internal/model"
	"fitness/go-admin/internal/repository"
	"log"
	"time"
)

// ChatStatisticsService 客服统计服务接口
type ChatStatisticsService interface {
	GetStaffStatistics(req *model.StaffStatisticsReq) (*model.StaffStatisticsResp, error)
}

// chatStatisticsService 客服统计服务实现
type chatStatisticsService struct {
	statsRepo *repository.ChatStatisticsRepository
	userRepo  repository.UserRepository
}

// NewChatStatisticsService 创建客服统计服务
func NewChatStatisticsService(statsRepo *repository.ChatStatisticsRepository, userRepo repository.UserRepository) ChatStatisticsService {
	return &chatStatisticsService{
		statsRepo: statsRepo,
		userRepo:  userRepo,
	}
}

// GetStaffStatistics 获取客服统计数据
func (s *chatStatisticsService) GetStaffStatistics(req *model.StaffStatisticsReq) (*model.StaffStatisticsResp, error) {
	// 1. 验证客服是否存在
	staff, err := s.userRepo.GetByID(req.StaffID)
	if err != nil {
		return nil, errors.New("客服不存在")
	}

	// 2. 解析日期
	startDate, err := time.Parse("2006-01-02", req.StartDate)
	if err != nil {
		return nil, errors.New("开始日期格式错误，应为 YYYY-MM-DD")
	}

	endDate, err := time.Parse("2006-01-02", req.EndDate)
	if err != nil {
		return nil, errors.New("结束日期格式错误，应为 YYYY-MM-DD")
	}

	// 3. 验证日期范围
	if endDate.Before(startDate) {
		return nil, errors.New("结束日期不能早于开始日期")
	}

	// 限制查询范围不超过1年
	if endDate.Sub(startDate) > 365*24*time.Hour {
		return nil, errors.New("查询范围不能超过1年")
	}

	log.Printf("[客服统计] 开始统计客服 %d (%s) 的工作量，时间范围：%s ~ %s", 
		req.StaffID, staff.Username, req.StartDate, req.EndDate)

	// 4. 获取基础统计数据
	stats, err := s.statsRepo.GetStaffStatistics(req.StaffID, startDate, endDate)
	if err != nil {
		log.Printf("[客服统计] 获取基础统计失败: %v", err)
		return nil, err
	}

	// 5. 获取平均响应时间
	avgResponseTime, err := s.statsRepo.GetAverageResponseTime(req.StaffID, startDate, endDate)
	if err != nil {
		log.Printf("[客服统计] 获取平均响应时间失败: %v", err)
		// 不阻断流程，使用默认值
		avgResponseTime = 0
	}

	// 6. 获取总消息数
	totalMessages, err := s.statsRepo.GetTotalMessages(req.StaffID, startDate, endDate)
	if err != nil {
		log.Printf("[客服统计] 获取总消息数失败: %v", err)
		totalMessages = 0
	}

	// 7. 获取评分分布
	ratingDistribution, err := s.statsRepo.GetRatingDistribution(req.StaffID, startDate, endDate)
	if err != nil {
		log.Printf("[客服统计] 获取评分分布失败: %v", err)
		ratingDistribution = make(map[string]int64)
	}

	// 8. 获取每日会话数
	sessionsPerDay, err := s.statsRepo.GetSessionsPerDay(req.StaffID, startDate, endDate)
	if err != nil {
		log.Printf("[客服统计] 获取每日会话数失败: %v", err)
		sessionsPerDay = make(map[string]int64)
	}

	// 9. 构建响应
	resp := &model.StaffStatisticsResp{
		StaffID:            req.StaffID,
		StaffName:          staff.Username,
		TotalSessions:      stats.TotalSessions,
		ActiveSessions:     stats.ActiveSessions,
		ClosedSessions:     stats.ClosedSessions,
		AvgResponseTime:    avgResponseTime,
		AvgRating:          stats.AvgRating,
		TotalMessages:      totalMessages,
		AvgSessionDuration: stats.AvgSessionDuration,
		RatingDistribution: ratingDistribution,
		SessionsPerDay:     sessionsPerDay,
		DateRange: model.DateRange{
			StartDate: startDate,
			EndDate:   endDate,
		},
	}

	log.Printf("[客服统计] 统计完成 - 客服: %s, 总会话: %d, 平均响应: %.2f秒, 平均评分: %.2f",
		staff.Username, resp.TotalSessions, resp.AvgResponseTime, resp.AvgRating)

	return resp, nil
}

